package collection;

/**
 * 排序自定义
 */

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list= new ArrayList<>();
        list.add(new Point(1,22));
        list.add(new Point(3,42));
        list.add(new Point(52,63));
        list.add(new Point(1,32));
        System.out.println(list);

        /*
        sort() 方法在排序集合时，要求集合元素必须可以比较大小
        是否可以比较大小的依据是元素是否实现了接口comparable

        侵入性问题：
        当我们使用某个API时，如果它要求我们为其修改额外的代码，那么该操作就具有侵入性
        侵入性：不利于程序后期的维护，因此应当尽量避免
         */
        // 使用collections.sort排序会报错
        // Collections.sort(list);

        /*
        方法1：创建一个比较器myComparator,使用implements Comparator  实现Comparator接口
        在里面重写compare方法，实现比较规则
        存在非常大的侵入性问题
         */

//        myComparator myComparator = new myComparator();
//        Collections.sort(list,myComparator);

        /*
        方法2：使用匿名内部类
         */
        /*
        // 使用匿名内部类,但还是创建了一个比较器对象
        Comparator<Point> comparator = new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                // 点到原点的距离长的大
                // 求o1点到原点的距离
                int dist = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int dist1 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return dist - dist1;
            }
        };
        Collections.sort(list,comparator);

         */

        /*
        方法3：使用lambda表达式
         */
        // 也可以基于上面简化
        Collections.sort(list, new Comparator<Point>(){
            @Override
            public int compare(Point o1, Point o2) {
                // 点到原点的距离长的大
                // 求o1点到原点的距离
                int dist = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int dist1 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return  dist - dist1;
            }
        });
        System.out.println(list);


    }
}
/*
// 自己创建比较器,还没有没有解决侵入性问题
class myComparator implements Comparator<Point> {
    @Override
    public int compare(Point o1, Point o2) {
        // 点到原点的距离长的大
        // 求o1点到原点的距离
        int dist = o1.getX()*o1.getX()+o1.getY()*o1.getY();
        int dist1 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
        return o1.getX()-o2.getX();
    }

}
 */